using System;
using Server.Mobiles;

namespace Server.Items
{
	/// <summary>
	/// Perfect for the foot-soldier, the Dismount special attack can unseat a mounted opponent.
	/// The fighter using this ability must be on his own two feet and not in the saddle of a steed
	/// (with one exception: players may use a lance to dismount other players while mounted).
	/// If it works, the target will be knocked off his own mount and will take some extra damage from the fall!
	/// </summary>
	public class Dismount : WeaponAbility
	{
		public Dismount()
		{
		}

		public override int BaseMana { get { return 20; } }

		public override bool Validate(Mobile from)
		{
			if (!base.Validate(from))
				return false;

			if (from.Mounted)
			{
				from.SendLocalizedMessage(1061283); // You cannot perform that attack while mounted!
				return false;
			}

			return true;
		}

		public static readonly TimeSpan DefenderRemountDelay = TimeSpan.FromSeconds(10.0); // TODO: Taken from bola script, needs to be verified
		public static readonly TimeSpan AttackerRemountDelay = TimeSpan.FromSeconds(3.0);

		public override void OnHit(Mobile attacker, Mobile defender, int damage)
		{
			if (!Validate(attacker))
				return;

			if (defender is ChaosDragoon || defender is ChaosDragoonElite)
				return;

			if (attacker.Mounted) // TODO: Should there be a message here?
				return;

			ClearCurrentAbility(attacker);

			IMount mount = defender.Mount;

			if (mount == null)
			{
				attacker.SendLocalizedMessage(1060848); // This attack only works on mounted targets
				return;
			}

			if (!CheckMana(attacker, true))
				return;

			if (Core.ML && attacker is LesserHiryu && 0.8 >= Utility.RandomDouble())
			{
				return; //Lesser Hiryu have an 80% chance of missing this attack
			}

			attacker.SendLocalizedMessage(1060082); // The force of your attack has dislodged them from their mount!

			if (attacker.Mounted)
				defender.SendLocalizedMessage(1062315); // You fall off your mount!
			else
				defender.SendLocalizedMessage(1060083); // You fall off of your mount and take damage!

			defender.PlaySound(0x140);
			defender.FixedParticles(0x3728, 10, 15, 9955, EffectLayer.Waist);

			mount.Rider = null;

			BaseMount.SetMountPrevention(defender, BlockMountType.Dazed, DefenderRemountDelay);
			if (Core.ML && attacker is BaseCreature && ((BaseCreature)attacker).ControlMaster != null)
			{
				BaseMount.SetMountPrevention(((BaseCreature)attacker).ControlMaster, BlockMountType.DismountRecovery, AttackerRemountDelay);
			}
			else
			{
				BaseMount.SetMountPrevention(attacker, BlockMountType.DismountRecovery, AttackerRemountDelay);
			}

			if (!attacker.Mounted)
				AOS.Damage(defender, attacker, Utility.RandomMinMax(15, 25), 100, 0, 0, 0, 0);
		}
	}
}